# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt


import frappe
from frappe.tests import IntegrationTestCase

from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
from erpnext.selling.report.sales_analytics.sales_analytics import execute


class TestAnalytics(IntegrationTestCase):
	def test_sales_analytics(self):
		frappe.db.sql("delete from `tabSales Order` where company='_Test Company 2'")

		create_sales_orders()

		self.compare_result_for_customer()
		self.compare_result_for_customer_group()
		self.compare_result_for_customer_based_on_quantity()

	def compare_result_for_customer(self):
		filters = {
			"doc_type": "Sales Order",
			"range": "Monthly",
			"to_date": "2018-03-31",
			"tree_type": "Customer",
			"company": "_Test Company 2",
			"from_date": "2017-04-01",
			"value_quantity": "Value",
		}

		report = execute(filters)

		expected_data = [
			{
				"entity": "_Test Customer 1",
				"entity_name": "_Test Customer 1",
				"apr_2017": 0.0,
				"may_2017": 0.0,
				"jun_2017": 0.0,
				"jul_2017": 0.0,
				"aug_2017": 0.0,
				"oct_2017": 0.0,
				"sep_2017": 0.0,
				"nov_2017": 0.0,
				"dec_2017": 0.0,
				"jan_2018": 0.0,
				"feb_2018": 2000.0,
				"mar_2018": 0.0,
				"total": 2000.0,
			},
			{
				"entity": "_Test Customer 2",
				"entity_name": "_Test Customer 2",
				"apr_2017": 0.0,
				"may_2017": 0.0,
				"jun_2017": 0.0,
				"jul_2017": 0.0,
				"aug_2017": 0.0,
				"sep_2017": 1500.0,
				"oct_2017": 1000.0,
				"nov_2017": 0.0,
				"dec_2017": 0.0,
				"jan_2018": 0.0,
				"feb_2018": 0.0,
				"mar_2018": 0.0,
				"total": 2500.0,
			},
			{
				"entity": "_Test Customer 3",
				"entity_name": "_Test Customer 3",
				"apr_2017": 0.0,
				"may_2017": 0.0,
				"jun_2017": 2000.0,
				"jul_2017": 1000.0,
				"aug_2017": 0.0,
				"sep_2017": 0.0,
				"oct_2017": 0.0,
				"nov_2017": 0.0,
				"dec_2017": 0.0,
				"jan_2018": 0.0,
				"feb_2018": 0.0,
				"mar_2018": 0.0,
				"total": 3000.0,
			},
		]
		result = sorted(report[1], key=lambda k: k["entity"])
		self.assertEqual(expected_data, result)

	def compare_result_for_customer_group(self):
		filters = {
			"doc_type": "Sales Order",
			"range": "Monthly",
			"to_date": "2018-03-31",
			"tree_type": "Customer Group",
			"company": "_Test Company 2",
			"from_date": "2017-04-01",
			"value_quantity": "Value",
		}

		report = execute(filters)

		expected_first_row = {
			"entity": "All Customer Groups",
			"indent": 0,
			"apr_2017": 0.0,
			"may_2017": 0.0,
			"jun_2017": 2000.0,
			"jul_2017": 1000.0,
			"aug_2017": 0.0,
			"sep_2017": 1500.0,
			"oct_2017": 1000.0,
			"nov_2017": 0.0,
			"dec_2017": 0.0,
			"jan_2018": 0.0,
			"feb_2018": 2000.0,
			"mar_2018": 0.0,
			"total": 7500.0,
		}
		self.assertEqual(expected_first_row, report[1][0])

	def compare_result_for_customer_based_on_quantity(self):
		filters = {
			"doc_type": "Sales Order",
			"range": "Monthly",
			"to_date": "2018-03-31",
			"tree_type": "Customer",
			"company": "_Test Company 2",
			"from_date": "2017-04-01",
			"value_quantity": "Quantity",
		}

		report = execute(filters)

		expected_data = [
			{
				"entity": "_Test Customer 1",
				"entity_name": "_Test Customer 1",
				"apr_2017": 0.0,
				"may_2017": 0.0,
				"jun_2017": 0.0,
				"jul_2017": 0.0,
				"aug_2017": 0.0,
				"sep_2017": 0.0,
				"oct_2017": 0.0,
				"nov_2017": 0.0,
				"dec_2017": 0.0,
				"jan_2018": 0.0,
				"feb_2018": 20.0,
				"mar_2018": 0.0,
				"total": 20.0,
			},
			{
				"entity": "_Test Customer 2",
				"entity_name": "_Test Customer 2",
				"apr_2017": 0.0,
				"may_2017": 0.0,
				"jun_2017": 0.0,
				"jul_2017": 0.0,
				"aug_2017": 0.0,
				"sep_2017": 15.0,
				"oct_2017": 10.0,
				"nov_2017": 0.0,
				"dec_2017": 0.0,
				"jan_2018": 0.0,
				"feb_2018": 0.0,
				"mar_2018": 0.0,
				"total": 25.0,
			},
			{
				"entity": "_Test Customer 3",
				"entity_name": "_Test Customer 3",
				"apr_2017": 0.0,
				"may_2017": 0.0,
				"jun_2017": 20.0,
				"jul_2017": 10.0,
				"aug_2017": 0.0,
				"sep_2017": 0.0,
				"oct_2017": 0.0,
				"nov_2017": 0.0,
				"dec_2017": 0.0,
				"jan_2018": 0.0,
				"feb_2018": 0.0,
				"mar_2018": 0.0,
				"total": 30.0,
			},
		]
		result = sorted(report[1], key=lambda k: k["entity"])
		self.assertEqual(expected_data, result)


def create_sales_orders():
	frappe.set_user("Administrator")

	make_sales_order(
		company="_Test Company 2",
		qty=10,
		customer="_Test Customer 1",
		transaction_date="2018-02-10",
		warehouse="Finished Goods - _TC2",
		currency="EUR",
	)

	make_sales_order(
		company="_Test Company 2",
		qty=10,
		customer="_Test Customer 1",
		transaction_date="2018-02-15",
		warehouse="Finished Goods - _TC2",
		currency="EUR",
	)

	make_sales_order(
		company="_Test Company 2",
		qty=10,
		customer="_Test Customer 2",
		transaction_date="2017-10-10",
		warehouse="Finished Goods - _TC2",
		currency="EUR",
	)

	make_sales_order(
		company="_Test Company 2",
		qty=15,
		customer="_Test Customer 2",
		transaction_date="2017-09-23",
		warehouse="Finished Goods - _TC2",
		currency="EUR",
	)

	make_sales_order(
		company="_Test Company 2",
		qty=20,
		customer="_Test Customer 3",
		transaction_date="2017-06-15",
		warehouse="Finished Goods - _TC2",
		currency="EUR",
	)

	make_sales_order(
		company="_Test Company 2",
		qty=10,
		customer="_Test Customer 3",
		transaction_date="2017-07-10",
		warehouse="Finished Goods - _TC2",
		currency="EUR",
	)
